iT邦幫忙

2022 iThome 鐵人賽

DAY 11
2

Day 11 Server Subscription Plans

既然我們昨天寫出了 MongoDB 的儲存後端,那我們就可以來寫一個有趣的模組了:伺服器訂閱方案。

總而言之,我希望模組可以長這樣:

https://i.imgur.com/lcEfmBo.png

.use(new Subscription(["premium", "premium+", "test"])) 這個方法會接受一個陣列,裡面是方案的名稱。模組會依照這些方案的名稱為每個 guild 建立一個 plan-expiration 的紀錄儲存在資料庫裡。

.use(new SubscriptionChecker()) 則是提供 !sub 指令讓使用者可以查看該伺服器所具有的訂閱項目。

Subscription 模組

這個模組會為 ctx 介面擴充一個 subs 屬性,讓其他模組可以查詢正在處理的 guild 具有什麼訂閱方案。

https://i.imgur.com/Elqch8H.png

SubscriptionChecker 模組

這個模組會提供 !sub 指令讓使用者可以查看該伺服器所具有的訂閱項目。

我們可以用 StoreContext & StoreSubContext 來擴充 ctx 介面,讓我們可以在 ctx 上使用 ctx.subs 查詢該伺服器的訂閱方案。

class SubscriptionChecker extends BaseModule implements Module {
    name = "subscription-checker";
    intents = [
        GatewayIntentBits.Guilds,
        GatewayIntentBits.GuildMessages,
        GatewayIntentBits.MessageContent,
    ];

    async messageCreate(
        args: [message: Message<boolean>],
        ctx: StoreContext & StoreSubContext,
        next: CallNextModule,
    ): Promise<void> {
        const [message] = args;

        if (message.content !== "!sub") {
            await next();
            return;
        }

        const subs = await ctx.subs?.();
        if (!subs || subs.size === 0) {
            await message.reply("This server has no active subscriptions.");
        } else {
            await message.reply(
                `This server has the following active subscriptions: \n${[...subs.entries()]
                    .map(([plan, exp]) => `- **${plan}** (Until ${exp.toLocaleString()})`)
                    .join("\n")}`,
            );
        }
    }
}

伺服器原本是沒有訂閱方案的,所以我們先來看看沒有訂閱方案的情況:

https://i.imgur.com/48OevmQ.png

然後我們可以用 MongoDB Compass 來修改記錄:

https://i.imgur.com/drRpJpu.png

預設的時間是 1970-01-01T00:00:00.000Z(Unix 時間戳記的起始時間)。

我們再來看看有訂閱方案的情況:

https://i.imgur.com/l8b8Njp.png

其他模組也可以使用 ctx.subs 查詢該伺服器的訂閱方案,但是要注意的是,Subscription 模組必須要在欲使用 ctx.subs 的模組之前被載入。

接下來,應該要來研究一下簡化 interaction 流程的模組了。


每日鐵人賽熱門 Top 10 (2022-09-26)

以 2022/09/25 20:00 ~ 2022/09/26 20:00 文章觀看數增加值排名

誤差: 1 小時

  1. +1057 D08 - 載入就應該要有載入的樣子
    • 作者: 鱈魚
    • 系列:派對動物嗨起來!
  2. +1054 D07 - 開趴前先 loading 一下
    • 作者: 鱈魚
    • 系列:派對動物嗨起來!
  3. +1032 D11 - 開房間!開派對!♪( ◜ω◝و(و
    • 作者: 鱈魚
    • 系列:派對動物嗨起來!
  4. +1029 D10 - 讓前後端接上線
    • 作者: 鱈魚
    • 系列:派對動物嗨起來!
  5. +1026 D01 - 沒時間解釋了,快上車!
    • 作者: 鱈魚
    • 系列:派對動物嗨起來!
  6. +1026 D09 - NestJS 是啥?好吃嗎?
    • 作者: 鱈魚
    • 系列:派對動物嗨起來!
  7. +1001 D06 - 打造遊戲選單按鈕
    • 作者: 鱈魚
    • 系列:派對動物嗨起來!
  8. +938 D03 - 建立專案
    • 作者: 鱈魚
    • 系列:派對動物嗨起來!
  9. +938 D02 - 來打個草稿吧
    • 作者: 鱈魚
    • 系列:派對動物嗨起來!
  10. +935 D04 - 門面怎麼可以沒有背景
    • 作者: 鱈魚
    • 系列:派對動物嗨起來!

今日評語:恭喜鱈魚?????(他寫的文章是蠻有趣的啦)


上一篇
Day 10 MongoDB 儲存後端
下一篇
Day 12 開發路上,必有重構
系列文
Discord Bot with TypeScript: Framework, Database, and Modules30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言